<?php

    /**
     * PHPExcel_Cell_DataValidation
     * Copyright (c) 2006 - 2015 PHPExcel
     * This library is free software; you can redistribute it and/or
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
     * version 2.1 of the License, or (at your option) any later version.
     * This library is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Lesser General Public License for more details.
     * You should have received a copy of the GNU Lesser General Public
     * License along with this library; if not, write to the Free Software
     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     * @category   PHPExcel
     * @package    PHPExcel_Cell
     * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
     * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
     * @version    ##VERSION##, ##DATE##
     */
    class PHPExcel_Cell_DataValidation {
        /* Data validation types */
        const TYPE_NONE       = 'none';
        const TYPE_CUSTOM     = 'custom';
        const TYPE_DATE       = 'date';
        const TYPE_DECIMAL    = 'decimal';
        const TYPE_LIST       = 'list';
        const TYPE_TEXTLENGTH = 'textLength';
        const TYPE_TIME       = 'time';
        const TYPE_WHOLE      = 'whole';
        /* Data validation error styles */
        const STYLE_STOP        = 'stop';
        const STYLE_WARNING     = 'warning';
        const STYLE_INFORMATION = 'information';
        /* Data validation operators */
        const OPERATOR_BETWEEN            = 'between';
        const OPERATOR_EQUAL              = 'equal';
        const OPERATOR_GREATERTHAN        = 'greaterThan';
        const OPERATOR_GREATERTHANOREQUAL = 'greaterThanOrEqual';
        const OPERATOR_LESSTHAN           = 'lessThan';
        const OPERATOR_LESSTHANOREQUAL    = 'lessThanOrEqual';
        const OPERATOR_NOTBETWEEN         = 'notBetween';
        const OPERATOR_NOTEQUAL           = 'notEqual';
        /**
         * Formula 1
         * @var string
         */
        private $formula1;
        /**
         * Formula 2
         * @var string
         */
        private $formula2;
        /**
         * Type
         * @var string
         */
        private $type = PHPExcel_Cell_DataValidation::TYPE_NONE;
        /**
         * Error style
         * @var string
         */
        private $errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP;
        /**
         * Operator
         * @var string
         */
        private $operator;
        /**
         * Allow Blank
         * @var boolean
         */
        private $allowBlank;
        /**
         * Show DropDown
         * @var boolean
         */
        private $showDropDown;
        /**
         * Show InputMessage
         * @var boolean
         */
        private $showInputMessage;
        /**
         * Show ErrorMessage
         * @var boolean
         */
        private $showErrorMessage;
        /**
         * Error title
         * @var string
         */
        private $errorTitle;
        /**
         * Error
         * @var string
         */
        private $error;
        /**
         * Prompt title
         * @var string
         */
        private $promptTitle;
        /**
         * Prompt
         * @var string
         */
        private $prompt;

        /**
         * Create a new PHPExcel_Cell_DataValidation
         */
        public function __construct() {
            // Initialise member variables
            $this->formula1         = '';
            $this->formula2         = '';
            $this->type             = PHPExcel_Cell_DataValidation::TYPE_NONE;
            $this->errorStyle       = PHPExcel_Cell_DataValidation::STYLE_STOP;
            $this->operator         = '';
            $this->allowBlank       = false;
            $this->showDropDown     = false;
            $this->showInputMessage = false;
            $this->showErrorMessage = false;
            $this->errorTitle       = '';
            $this->error            = '';
            $this->promptTitle      = '';
            $this->prompt           = '';
        }

        /**
         * Get Formula 1
         * @return string
         */
        public function getFormula1() {
            return $this->formula1;
        }

        /**
         * Set Formula 1
         * @param  string $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setFormula1($value = '') {
            $this->formula1 = $value;
            return $this;
        }

        /**
         * Get Formula 2
         * @return string
         */
        public function getFormula2() {
            return $this->formula2;
        }

        /**
         * Set Formula 2
         * @param  string $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setFormula2($value = '') {
            $this->formula2 = $value;
            return $this;
        }

        /**
         * Get Type
         * @return string
         */
        public function getType() {
            return $this->type;
        }

        /**
         * Set Type
         * @param  string $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setType($value = PHPExcel_Cell_DataValidation::TYPE_NONE) {
            $this->type = $value;
            return $this;
        }

        /**
         * Get Error style
         * @return string
         */
        public function getErrorStyle() {
            return $this->errorStyle;
        }

        /**
         * Set Error style
         * @param  string $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setErrorStyle($value = PHPExcel_Cell_DataValidation::STYLE_STOP) {
            $this->errorStyle = $value;
            return $this;
        }

        /**
         * Get Operator
         * @return string
         */
        public function getOperator() {
            return $this->operator;
        }

        /**
         * Set Operator
         * @param  string $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setOperator($value = '') {
            $this->operator = $value;
            return $this;
        }

        /**
         * Get Allow Blank
         * @return boolean
         */
        public function getAllowBlank() {
            return $this->allowBlank;
        }

        /**
         * Set Allow Blank
         * @param  boolean $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setAllowBlank($value = false) {
            $this->allowBlank = $value;
            return $this;
        }

        /**
         * Get Show DropDown
         * @return boolean
         */
        public function getShowDropDown() {
            return $this->showDropDown;
        }

        /**
         * Set Show DropDown
         * @param  boolean $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setShowDropDown($value = false) {
            $this->showDropDown = $value;
            return $this;
        }

        /**
         * Get Show InputMessage
         * @return boolean
         */
        public function getShowInputMessage() {
            return $this->showInputMessage;
        }

        /**
         * Set Show InputMessage
         * @param  boolean $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setShowInputMessage($value = false) {
            $this->showInputMessage = $value;
            return $this;
        }

        /**
         * Get Show ErrorMessage
         * @return boolean
         */
        public function getShowErrorMessage() {
            return $this->showErrorMessage;
        }

        /**
         * Set Show ErrorMessage
         * @param  boolean $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setShowErrorMessage($value = false) {
            $this->showErrorMessage = $value;
            return $this;
        }

        /**
         * Get Error title
         * @return string
         */
        public function getErrorTitle() {
            return $this->errorTitle;
        }

        /**
         * Set Error title
         * @param  string $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setErrorTitle($value = '') {
            $this->errorTitle = $value;
            return $this;
        }

        /**
         * Get Error
         * @return string
         */
        public function getError() {
            return $this->error;
        }

        /**
         * Set Error
         * @param  string $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setError($value = '') {
            $this->error = $value;
            return $this;
        }

        /**
         * Get Prompt title
         * @return string
         */
        public function getPromptTitle() {
            return $this->promptTitle;
        }

        /**
         * Set Prompt title
         * @param  string $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setPromptTitle($value = '') {
            $this->promptTitle = $value;
            return $this;
        }

        /**
         * Get Prompt
         * @return string
         */
        public function getPrompt() {
            return $this->prompt;
        }

        /**
         * Set Prompt
         * @param  string $value
         * @return PHPExcel_Cell_DataValidation
         */
        public function setPrompt($value = '') {
            $this->prompt = $value;
            return $this;
        }

        /**
         * Get hash code
         * @return string    Hash code
         */
        public function getHashCode() {
            return md5($this->formula1 . $this->formula2 . $this->type = PHPExcel_Cell_DataValidation::TYPE_NONE . $this->errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP . $this->operator . ($this->allowBlank ? 't' : 'f') . ($this->showDropDown ? 't' : 'f') . ($this->showInputMessage ? 't' : 'f') . ($this->showErrorMessage ? 't' : 'f') . $this->errorTitle . $this->error . $this->promptTitle . $this->prompt . __CLASS__
            );
        }

        /**
         * Implement PHP __clone to create a deep clone, not just a shallow copy.
         */
        public function __clone() {
            $vars = get_object_vars($this);
            foreach ($vars as $key => $value) {
                if (is_object($value)) {
                    $this->$key = clone $value;
                } else {
                    $this->$key = $value;
                }
            }
        }
    }
